/*
 * 版权声明 (c) 2025 XXX科技有限公司
 *
 * 本软件及其相关文档文件受版权保护。未经版权所有者明确书面许可，任何单位或个人不得
 * 以任何形式复制、传播、修改、出售、出租、反向工程、反编译或利用本软件的任何部分。
 *
 * 对于任何违反本声明的行为，版权所有者保留追究法律责任的权利。
 */
#define _CRT_SECURE_NO_WARNINGS
#include "phonebook.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>

// 手机号有效性校验：11位数字，首位为'1'
int isValidPhoneNumber(const char *phone) {
	if (strlen(phone) != 11) return 0;
	if (phone[0] != '1') return 0;
	for (int i = 0; i < 11; ++i) {
		if (!isdigit((unsigned char) phone[i])) return 0;
	}
	return 1;
}

// 检查联系人是否已存在
int isDuplicateContact(const PhoneBook *pb, const char *name, const char *phone) {
	for (int i = 0; i < pb->count; ++i) {
		if (strcmp(name, pb->contacts[i].name) == 0 || strcmp(phone, pb->contacts[i].phone) == 0) {
			return 1;
		}
	}
	return 0;
}

// 清理缓冲区，防止输入混乱
void flushInput() {
	int c;
	while ((c = getchar()) != '\n' && c != EOF)
		;
}

void initializePhoneBook(PhoneBook *pb) { pb->count = 0; }

void addContact(PhoneBook *pb) {
	if (pb->count >= MAX_CONTACTS) {
		printf("⛔ 通讯录已满,无法继续.\n");
		return;
	}

	char name[NAME_LENGTH];
	char phone[PHONE_LENGTH];

	printf("请输入联系人信息 \n");
	printf("-> 姓名: ");
	scanf(" %20[^\n]", name);
	flushInput(); // 清理输入缓冲区

	printf("-> 电话: ");
	scanf(" %11s", phone);
	flushInput();

	if (!isValidPhoneNumber(phone)) {
		printf("⛔ 手机号无效,必须是11位数字且首位为1.\n");
		return;
	}

	// 重复检查
	if (isDuplicateContact(pb, name, phone)) {
		printf("⛔ 已存在相同姓名或手机号的联系人.\n");
		return;
	}

	strncpy(pb->contacts[pb->count].name, name, NAME_LENGTH - 1);
	pb->contacts[pb->count].name[NAME_LENGTH - 1] = '\0';
	strncpy(pb->contacts[pb->count].phone, phone, PHONE_LENGTH - 1);
	pb->contacts[pb->count].phone[PHONE_LENGTH - 1] = '\0';

	pb->count++;
	printf("✅ 添加成功.\n");
}

void searchContact(const PhoneBook *pb) {
	char name[NAME_LENGTH];
	int  found = 0;
	printf("请输入姓名: ");
	scanf(" %20[^\n]", name);
	flushInput();
	for (int i = 0; i < pb->count; ++i) {
		if (strcmp(name, pb->contacts[i].name) == 0) {
			printf("姓名: %s \t 电话: %s \n", pb->contacts[i].name, pb->contacts[i].phone);
			found = 1;
			break;
		}
	}

	if (!found) {
		printf("⛔ 未找到该联系人.\n");
	}
}

void displayContacts(const PhoneBook *pb) {
	if (pb->count == 0) {
		printf("⛔ 通讯录为空.\n");
		return;
	}
	for (int i = 0; i < pb->count; ++i) {
		printf("%d. 姓名: %s \t电话: %s\n", i + 1, pb->contacts[i].name, pb->contacts[i].phone);
	}
}
